// 知识点1：类的定义方法：struct和class两种方法的用法和区别。

// 知识点2：类内成员的初始化方法：成员初始化列表。编译器会调用构造函数初始化成员，可以被重载。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
/*
C++ 中保留了C语言的 struct 关键字，并且加以扩充。在C语言中，struct
只能包含成员变量，不能包含成员函数。 而在C++中，struct 类似于
class，既可以包含成员变量，又可以包含成员函数。 C++中的 struct 和 class
基本是通用的，唯有几个细节不同： 1:使用 class 时，类中的成员默认都是 private
属性的；而使用 struct 时，结构体中的成员默认都是 public 属性的。(最本质的区别)
2:class 继承默认是 private 继承，而 struct 继承默认是 public
继承（《C++继承与派生》一章会讲解继承）。 3:class 可以使用模板，而 struct 不能。
*/

//利用class定义类
class Student {
  Student(string name, int age, int score); //构造函数

  string m_name;
  int m_age;
  int m_score; //定义三个变量

  void showname() //定义一个函数
  {
    cout << m_name << "的年龄是：" << m_age << ",得分为：" << m_score << endl;
  } //类内定义的函数，编译器会优先视为内联函数
public:
private:
protected: //三种形式
};
Student::Student(string name, int age, int score)
    : m_name(name), m_age(age), m_score(score) {}
//成员初始化列表，将name赋给m_name，改变类内变量

//利用strcut定义类
struct Students {
  Students(string name, int age, int score); //构造函数

  string m_name;
  int m_age;
  int m_score; //定义三个变量，默认public

  void shownames() //定义一个函数
  {
    cout << m_name << "的年龄是：" << m_age << ",得分为：" << m_score << endl;
  } //类内类外定义皆是在同文件中，也可定义在.h文件中。
};
Students::Students(string name, int age, int score)
    : m_name(name), m_age(age), m_score(score) {}
//列表初始化，覆盖类的内部变量

/*
总结
1：struct作为数据结构的实现体，它默认的数据访问控制是public的，而class作为对象的实现体，它默认的成员变量访问控制是private的
2：当你觉得你要做的更像是一种数据结构的话，那么用struct，如果你要做的更像是一种对象的话，那么用class。
3：然而对于访问控制，应该在程序里明确的指出，而不是依靠默认，这是一个良好的习惯，也让你的代码更具可读性。
*/

// int main(int argc, char **argv) {
//   //报错：虽然已声明，但是不可访问。成员没有限定public,默认都是private，外部不可访问。
//   // Student stu1("小明", 18, 3);
//   Students stu2("小明", 18, 3); //正常
//   stu2.shownames();
//   return 0;
// }

#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Sales_data {
  Sales_data(); // 构造函数声明
  string bookNo;
  unsigned units_sold;
  double revenue; //类内部的变量成员不允许在定义时初始化，必须使用构造函数
};
// 定义在外部的构造函数
Sales_data::Sales_data() {
  units_sold = 0;
  revenue = 0.0;
}

int main(int argc, char **argv) {
  Sales_data total; //此部分和第一章21页的内容相同
  if (cin >> total.bookNo >> total.units_sold >> total.revenue) {
    Sales_data trans;
    while (cin >> trans.bookNo >> trans.units_sold >> trans.revenue) {
      if (total.bookNo == trans.bookNo) {
        total.units_sold += trans.units_sold;
        total.revenue += trans.revenue; //第三题的使用修改之处
      } else {
        cout << total.bookNo << " " << total.units_sold << " " << total.revenue
             << endl;
        total = trans;
      }
    }
    cout << total.bookNo << " " << total.units_sold << " " << total.revenue
         << endl;
  } else {
    std::cerr << "No data?!" << std::endl;
    return -1;
  }
  return 0;
}